package hui.com.service.impl;

import hui.com.authority.UsersLogEntity;
import hui.com.dao.PermsDao;
import hui.com.dao.UserLogDao;
import hui.com.util.ObjectUtil;
import hui.com.JWT.JwtTokenProvider;
import hui.com.authority.UsersEntity;
import hui.com.service.UserLogService;
import hui.com.util.RedisUtil;
import hui.com.util.UUID4Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;


@Service
public class UserLogServiceImpl implements UserLogService {

    @Resource
    UserLogDao userLogDao;
    @Resource
    PermsDao permsDao;


    @Override
    public String getUsers(UsersEntity user) {

        UsersLogEntity usersLog = userLogDao.getUsers(user);

        // 账号是否存在
        if (usersLog!=null){


            // 账号之前是否有密钥
            if (usersLog.getSecretKey()!=null){
                // 允许多人登录
                if (usersLog.getIsMFA()){
                    // 返回原有令牌
                    return JwtTokenProvider.generateToken2(String.valueOf(usersLog.getUID()),usersLog.getSecretKey());
                }else{//不允许多人登录
                    // 获取先前的密钥转令牌
                    String oldToken = JwtTokenProvider.generateToken2(String.valueOf(usersLog.getUID()),usersLog.getSecretKey());
                    // 通过令牌查找存在的登陆账户，进行过期声明
                    UsersLogEntity oldUsersLog = RedisUtil.getValue(oldToken);
                    // 防止redis被重启，登录token被清除，导致的空值
                    if(oldUsersLog!=null){
                        oldUsersLog.setExpired(true);
                        // 去redis，重新赋值，声明该令牌过期。用于提醒账号被占用
                        RedisUtil.saveValue(oldToken,oldUsersLog,30,TimeUnit.DAYS);

                    }

                    //更替令牌
                    return update_token(usersLog);
                }
            }else{
                //更替令牌
                return update_token(usersLog);
            }
        }else{
            return null;
        }
    }

    @Override
    public Boolean updUIDExpired(Integer UID) {
        UsersLogEntity usersLog = userLogDao.getUserUID(UID);
        if(usersLog.getSecretKey()==null){
            return true;
        }
        // 获取先前的密钥转令牌
        String oldToken = JwtTokenProvider.generateToken2(String.valueOf(usersLog.getUID()),usersLog.getSecretKey());


        // 通过令牌查找存在的登陆账户
        UsersLogEntity oldUsersLog = RedisUtil.getValue(oldToken);
        // 防止redis被重启，登录token被清除，导致的空值
        if(oldUsersLog!=null){
            //进行过期声明
            oldUsersLog.setExpired(true);
            // 去redis，重新赋值，声明该令牌过期。用于提醒账号被占用
            RedisUtil.saveValue(oldToken,oldUsersLog,30,TimeUnit.DAYS);

        }
        return true;
    }

    @Override
    public Boolean updUIDUserPermission(Integer UID) {
        UsersLogEntity usersLog = userLogDao.getUserUID(UID);
        System.out.println(usersLog);
        //如果没有登录的密钥就不进行刷新
        if(usersLog.getSecretKey() ==null || usersLog.getSecretKey().isEmpty()){
            return true;
        }

        // 获取账号的所有权限
        String[] rolePerms = permsDao.getUserRolePermsCode(usersLog.getUID());//角色权限
        String[] userPerms = permsDao.getUserPermsCode(usersLog.getUID());//私有权限
        usersLog.setPermsArray(ObjectUtil.mergeArrays(rolePerms,userPerms));
        // 设置为未过期账户
        usersLog.setExpired(false);
        // 密钥变成令牌记录到redis中
        String token = JwtTokenProvider.generateToken2(String.valueOf(usersLog.getUID()),usersLog.getSecretKey());
//        String token2 = JwtTokenProvider.generateToken2(String.valueOf(usersLog.getUID()),usersLog.getOldSecretKey());
//        System.out.println(token+"\n"+token2);
//        System.out.println(new_key+"\n"+usersLog.getOldSecretKey());
        RedisUtil.saveValue(token,usersLog,30,TimeUnit.DAYS);

        return true;
    }

    /**
     * 密钥更替，并记录到redis中
     * 记录账户的权限
     * @param usersLog 需要更替的对象
     * @return
     */
    private String update_token(UsersLogEntity usersLog){
        // 获取新密钥生成令牌,并放入数据库
        String new_key = UUID4Util.getUUID4();
        userLogDao.updateSecretKeyAndOldSecretKey(usersLog.getUID(), new_key,usersLog.getSecretKey());

        // 重新获取账号
        UsersLogEntity new_usersLog = userLogDao.getUsers(usersLog);
        // 获取账号的所有权限
        String[] rolePerms = permsDao.getUserRolePermsCode(new_usersLog.getUID());//角色权限
        String[] userPerms = permsDao.getUserPermsCode(new_usersLog.getUID());//私有权限
        new_usersLog.setPermsArray(ObjectUtil.mergeArrays(rolePerms,userPerms));
        // 设置为未过期账户
        new_usersLog.setExpired(false);
        // 密钥变成令牌记录到redis中
        String token = JwtTokenProvider.generateToken2(String.valueOf(new_usersLog.getUID()),new_key);
//        String token2 = JwtTokenProvider.generateToken2(String.valueOf(usersLog.getUID()),usersLog.getOldSecretKey());
//        System.out.println(token+"\n"+token2);
//        System.out.println(new_key+"\n"+usersLog.getOldSecretKey());
        RedisUtil.saveValue(token,new_usersLog,30,TimeUnit.DAYS);
        return token;

    }


}
